package com.java.innerclass;

/**
 * @author Lenl
 * @create 2021-05-31 16:49
 * 类的内部成员之5：内部类
 * 1.Java中允许一个类A声名在另一个类B中，类A就是内部类，类B称为外部类
 * 2.内部类的分类：成员内部类（静态、非静态） vs 局部内部类（方法内、代码块内、构造器内）
 *
 * 3.成员内部类：
 *      一方面作为外部类的成员：
 *          >调用外部类的结构
 *          >可以被4种不同权限修饰符修饰
 *
 *      另一方面，作为一个类：
 *          >类内可以定义属性、方法、构造器
 *          >可以被final修饰表不能继承，不使用final就可以继承
 *          >可以被abstract修饰
 *
 * 4.关注如下3个问题：
 *      4.1如何实例化成员内部类的对象
 *
 *      4.2如何在成员内部类中区分调用外部类的结构
 *
 *      4.3开发中局部内部类的使用
 *
 */
public class innerClassTest {
    public static void main(String[] args) {
        //创建Dog实例(静态成员内部类)
        Person.Dog dog=new Person.Dog();
        dog.show();
        //创建Bird实例（非静态成员内部类）
        Person p=new Person();
        Person.Bird b=p.new Bird();
        b.sing();
    }
}

class Person{
    String name;
    int age;
    public void eat(){
        System.out.println("人吃饭");
    }

    //静态成员内部类
    static class Dog{
        String name;
        int age;
        public void show(){
            System.out.println("卡拉是条狗");
        }
    }
    //非静态成员内部类
    class Bird{
        String name;
        public Bird(){}
        public void sing(){
            //调用外部类属性
            String n= Person.this.name;
            System.out.println("我是一只小小鸟");
        }
    }

    public void method(){
        //局部内部类
        class AA{

        }
    }

    {
        //局部内部类
        class BB{

        }
    }
    public Person(){
        //局部内部类
        class CC{

        }
    }
}